package kr.hkit.wordnote.activity;

import java.util.ArrayList;
import java.util.Locale;

import kr.hkit.wordnote.fragment.PlaceholderFragment;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.speech.tts.TextToSpeech;
import android.speech.tts.TextToSpeech.OnInitListener;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.Log;
import android.view.View;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.Switch;
import android.widget.TextView;
import android.widget.Toast;

import com.example.wordnote2.R;

public class FlipperActivity extends FragmentActivity implements OnInitListener {
	SectionsPagerAdapter mSectionsPagerAdapter;
	ViewPager mViewPager;
	ArrayList<String> engList;
	ArrayList<String> korList;
	TextView tv1;
	TextView tv2;
	Switch sw;
	CheckBox cb;
	String engWord;
	String korWord;
	int size;
	int delayTime;
	TextToSpeech mTTS;
	
	final static String TAG ="FlipperActivity";
	
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.flipperactivity);
		
		Intent intent = getIntent();
		engList = intent.getStringArrayListExtra("engChapterList");
		korList = intent.getStringArrayListExtra("korChapterList");
		delayTime = Integer.parseInt(intent.getStringExtra("delayTime")) * 1000;
		size = engList.size();
		mTTS = new TextToSpeech(this, null);   
		mTTS.setLanguage(Locale.US);  
		
		sw = (Switch)findViewById(R.id.switch_flip);
		sw.setOnCheckedChangeListener(new OnCheckedChangeListener() {
			public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
				//스위치를 자동으로 바꾸면 자동플립이 된다.
				if(isChecked == true){
					//현재 보여지는 페이지가 어떤 페이지인지 구하고, 핸들러를 호출하는 메소드 
					selectPage();
				}else if(isChecked == false){
					//스위치를 수동으로 바꾸면 자동플립이 해제 된다. 
					mHandler.removeMessages(1);
				}
			}
		});
		
		cb = (CheckBox)findViewById(R.id.checkBox_tts);
		cb.setOnCheckedChangeListener(new OnCheckedChangeListener() {
			//발음 체크박스를 체크하면 해당 영단어의 발음이 나온다.
			public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
				if(isChecked == true){
					int pageNum = mViewPager.getCurrentItem();
					engWord = engList.get(pageNum);
					mTTS.speak(engWord, TextToSpeech.QUEUE_FLUSH, null);
				}
			}
		});
		
		mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
		mViewPager = (ViewPager)findViewById(R.id.viewpager);
		mViewPager.setAdapter(mSectionsPagerAdapter);
		mViewPager.setOnPageChangeListener(new OnPageChangeListener() {
			public void onPageSelected(int arg0) {
				//페이지가 넘어갈 때마다 다음 메소드가 호출된다.
				selectPage();
				if(sw.isChecked() == true){
					//auto flipping되는 상태에서 손으로 넘겼을 때를 대비하여, 메세지를 지우고 다시 호출한다.
					//auto flipping상태에서 손으로 움직이면, message_1에 의해 페이지가 또 넘어가 버리는 문제가 발생! 
					mHandler.removeMessages(0);
					mHandler.removeMessages(1);
					mHandler.sendEmptyMessageDelayed(0, delayTime);
				}
			}
			
			@Override
			public void onPageScrolled(int arg0, float arg1, int arg2) {
				Log.d(TAG, "onPageScrolled");
				if(arg0 == 0){
					selectPage();
				}
			}
			
			@Override
			public void onPageScrollStateChanged(int arg0) {
				
			}
		});
	}
	
	
	//현재 보여지는 페이지가 어떤 페이지인지 구하고, 페이지에 따라 다른 단어를 변수에 저장하는 메서드.
	//내부적으로 text를 배치하는 메서드를 호출한다. 
	public void selectPage(){
		int pageNum = mViewPager.getCurrentItem();
		engWord = engList.get(pageNum);
		korWord = korList.get(pageNum);
		if(pageNum == 0){
			setTextandTTS(R.id.engtext00, R.id.kortext00);
		}else if(pageNum%3 == 0 && pageNum != 0){
			setTextandTTS(R.id.engtext01, R.id.kortext01);
		}else if(pageNum%3 == 1){
			setTextandTTS(R.id.engtext02, R.id.kortext02);
		}else if(pageNum%3 == 2){
			setTextandTTS(R.id.engtext03, R.id.kortext03);
		}
	}
	
	//text를 배치하고 tts 기능을 재생시키는 메서드 
	public void setTextandTTS(int engId, int korId){
		tv1 = (TextView)findViewById(engId);
		tv1.setText(engWord);
		if(cb.isChecked() == true)
        mTTS.speak(engWord, TextToSpeech.QUEUE_FLUSH, null); 
		tv2 = (TextView)findViewById(korId);
		tv2.setText(korWord);
		tv2.setVisibility(View.INVISIBLE);
		//호출한 핸들러에서 3초 후에 korword를 visible하는 작업을 수행한다.
		mHandler.sendEmptyMessageDelayed(0, delayTime);
	}
	
	
	
	//핸들러의 아래 메소드가 호출되면 korword를 나타내는 동작을 수행하고, 3초 뒤에 페이지를 넘기는 동작을 수행한다. 
	Handler mHandler = new Handler(){
		public void handleMessage(Message msg){
			if(msg.what == 0){
				tv2.setVisibility(View.VISIBLE);
				//3초 후에 페이지를 넘기는 동작을 수행토록 한다. 
				if(sw.isChecked() == true){
					mHandler.sendEmptyMessageDelayed(1, delayTime);
				}
			}
			if(msg.what == 1){
				int nextPage  = mViewPager.getCurrentItem()+1;
				if(nextPage >= size){
					//포지션이 끝에 다다르면 0부터 다시 시작한다. 
					mViewPager.setCurrentItem(0, false);
				}else{
					mViewPager.setCurrentItem(nextPage, false);
				}
			}
		}
	};
	
	
	//백스페이스 키가 눌려지면 message를 제거하고 액티비트를 종료시킨다. 
	public void onBackPressed() {
		mHandler.removeMessages(0);
		mHandler.removeMessages(1);
		finish();
	};

	@Override
	protected void onDestroy() {
		super.onDestroy();
		//TTS 엔진 사용 후 해제
		if(mTTS != null){
			mTTS.stop();
			mTTS.shutdown();
		}
	}
	
	public class SectionsPagerAdapter extends FragmentPagerAdapter {
		public SectionsPagerAdapter(FragmentManager fm) {
			super(fm);
			Log.d(TAG, "SectionsPagerAdapter");
		}
		
		@Override
		public Fragment getItem(int position) {
			Log.d(TAG, "getItem");
			engWord = engList.get(0);
			korWord = korList.get(0);
			return PlaceholderFragment.newInstance(position);
		}
		
		@Override
		public void destroyItem(View container, int position, Object object) {
			Log.d(TAG, "destroyItem");
		}
		
		@Override
		public int getCount() {
			return size;
		}
	}
	
	@Override
	public void onInit(int status) {
	}
}
